package br.com.translog.dao;

import br.com.translog.interfacee.IDAOFuncionario;
import br.com.translog.modelo.Funcionario;
import br.com.translog.modelo.Logradouro;
import br.com.translog.modelo.PessoaFisica;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DAOFuncionario implements IDAOFuncionario {
    
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("TranslogPU");

    private static EntityManager getEntityManager() {
        
        return emf.createEntityManager();
    }

    @Override
    public void cadastraFuncionario(Funcionario f, PessoaFisica pf, Logradouro l) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
                
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Persistindo os objetos...
            em.persist(pf);
            em.persist(l);
            em.persist(f);
            //Comitando a transacao...
            em.getTransaction().commit();
                 
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public void alteraFuncionario(Funcionario f) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Atualizando os objetos...
            em.merge(f.getCodigoPessoaFisica());
            em.merge(f.getCodigoLogradouro());
            em.merge(f);
            //Comitando a transacao...
            em.getTransaction().commit();
            
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public void excluiFuncionario(int matricula) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        Funcionario f;
        
        try {
            //Abrindo uma conexao para realizacao da transacao...
            em.getTransaction().begin();
            //Pesquisando o funcionario...
            f = em.find(Funcionario.class, matricula);
            //Removendo os objetos...
            em.remove(f.getCodigoPessoaFisica());
            em.remove(f.getCodigoLogradouro());
            em.remove(f);
            //Comitando a transacao...
            em.getTransaction().commit();
            
        } catch (Exception e) {
            //Desfazendo as alteracoes...
            em.getTransaction().rollback();
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
    }

    @Override
    public Funcionario consultaFuncionario(int matricula) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        Funcionario f;
        
        try {
            //Realizando a consulta...
            f = em.find(Funcionario.class, matricula);
            
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return f;
    }  
}
